/**
 协程控制
 */
package other

import (
	"context"
	"fmt"
	"sync"
)

func goroutineCtl() {
	// 初始化一个 context
	parent := context.Background()
	// 生成一个 可取消的 context, (还有超时取消，超时取消用的比较少)
	cxt, cancel := context.WithCancel(parent)
	runTime := 0
	var wg sync.WaitGroup
	wg.Add(1)
	go func(ctx context.Context) {
		for {
			select {
			case <-cxt.Done():
				fmt.Println("goroutine 已关闭")
				return
			default:
				fmt.Println("goroutine 存活时间:", runTime)
				runTime++
				break
			}

			if runTime == 5 {
				// 关闭 goroutine
				cancel()
				wg.Done()
			}
		}
	}(cxt)
	wg.Wait()
}
